home *** CD-ROM | disk | FTP | other *** search
- ;----------------------------------------------------------------------------
- ;
- ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_exec,v $
- ; $Date: 1996/11/06 22:01:42 $
- ; $Revision: 1.3 $
- ; $State: Rel $
- ; $Author: unixlib $
- ;
- ; $Log: _exec,v $
- ; Revision 1.3 1996/11/06 22:01:42 unixlib
- ; Yet more changes by NB, PB and SC.
- ;
- ; Revision 1.2 1996/10/30 21:59:00 unixlib
- ; Massive changes made by Nick Burret and Peter Burwood.
- ;
- ; Revision 1.1 1996/04/19 21:34:32 simon
- ; Initial revision
- ;
- ;----------------------------------------------------------------------------
-
- GET Unix37:unixlib.s.asm_dec
-
- AREA |C$$code|,CODE,READONLY
-
- IMPORT |__exret|
-
- IMPORT |__base|
- IMPORT |__rwlimit|
- IMPORT |__dynamic_num|
- IMPORT |__break|
-
- IMPORT |__exerr|
- IMPORT |raise|
- IMPORT |_exit|
-
- |__exec_s0|
-
- |__exec_s1|
- MOV v1,a1
- ADR a1,|__exreg|
- STMIA a1,{sl,fp,sp}
-
- MOV a1,#11
- ADR a2,|__exec_s4|
- MOV a3,#0
- MOV a4,#0
- SWI XOS_ChangeEnvironment
- STR a2,[pc,#|__o_exit|-.-8]
-
- LDR a1,[pc,#|__base_ptr|-.-8]
- LDR a1,[a1,#0]
- STR a1,[pc,#|__base_|-.-8]
- LDR a2,[pc,#|__rwlimit_ptr|-.-8]
- LDR a2,[a2,#0]
- STR a2,[pc,#|__rwlimit_|-.-8]
- ; save __break and __dynamic_num for later since they could get
- ; corrupted by the code shift below
- LDR a4,[pc,#|__break_ptr|-.-8]
- LDR a4,[a4,#0]
- STR a4,[pc,#|__break_|-.-8]
- LDR a4,[pc,#|__dynamic_num_ptr|-.-8]
- LDR a4,[a4,#0]
- STR a4,[pc,#|__dynamic_num_|-.-8]
- LDR a3,[pc,#|__codeshift|-.-8]
-
- [ PARANOID = 1
- CMP a3,#0
- MOVEQ a3,a1 ; no code shift required, so set
- BEQ |__exec_s3| ; a3 to base (what else?)
- ]
-
- ADD a3,a2,a3
-
- SUB a1,a2,a1
- ANDS a4,a1,#31
- BEQ |__exec_s2_1|
- |__exec_s2_0|
- LDR ip,[a2,#-4]!
- STR ip,[a3,#-4]!
- SUB a1,a1,#4
- ANDS a4,a1,#31
- BNE |__exec_s2_0|
- |__exec_s2_1|
- CMP a1,#0
- BEQ |__exec_s3|
- |__exec_s2_2|
- LDMDB a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
- STMDB a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
- SUBS a1,a1,#64
- LDMGEDB a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
- STMGEDB a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
- BGT |__exec_s2_2|
-
- |__exec_s3|
- ; save dynamic area information four times at top of application
- ; memory so it can be validated in new image
- ; start of area for spawned programs = __break
- LDR a4,[pc,#|__break_|-.-8]
- EOR v3,a4,a4,ROR #7
- EOR v5,a4,a4,ROR #13
- EOR sl,a4,a4,ROR #23
- LDR v2,[pc,#|__dynamic_num_|-.-8]
- EOR v4,v2,v2,ROR #7
- EOR v6,v2,v2,ROR #13
- EOR ip,v2,v2,ROR #23
- [ |__4K_BOUNDARY| = 1
- ; align top of wimpslot to 4k (downwards)
- SUB a3,a3,#32
- BIC a3,a3,#&ff
- BIC a3,a3,#&f00
- ADD a3,a3,#32
- ]
- STMDB a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
-
- MOV a1,#0
- MOV a2,a3
- MOV a3,#0
- MOV a4,#0
- SWI XOS_ChangeEnvironment
- STR a2,[pc,#|__o_himem|-.-8]
-
- MOV a1,v1
- SWI XOS_CLI
- MOVVC a1,#0
- STR a1,[pc,#|__exerr_|-.-8]
-
- |__exec_s4|
- MOV a1,#0
- LDR a2,[pc,#|__o_himem|-.-8]
- MOV a3,#0
- MOV a4,#0
- SWI XOS_ChangeEnvironment
-
- LDR a3,[pc,#|__base_|-.-8]
- LDR a1,[pc,#|__rwlimit_|-.-8]
- LDR a2,[pc,#|__codeshift|-.-8]
- [ PARANOID = 1
- CMP a2,#0
- BEQ |__exec_s6|
- ]
-
- ADD a1,a1,a2
- ADD a2,a3,a2
-
- SUB a1,a1,a2
- ANDS a4,a1,#31
- BEQ |__exec_s5_1|
- |__exec_s5_0|
- LDR ip,[a2],#4
- STR ip,[a3],#4
- SUB a1,a1,#4
- ANDS a4,a1,#31
- BNE |__exec_s5_0|
- |__exec_s5_1|
- CMP a1,#0
- BEQ |__exec_s6|
- |__exec_s5_2|
- LDMIA a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
- STMIA a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
- SUBS a1,a1,#64
- LDMGEIA a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
- STMGEIA a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
- BGT |__exec_s5_2|
-
- |__exec_s6|
- ; Flush instruction cache for StrongARM. Use RWLimit rather
- ; than ROLimit in case some code is in the data section
- MOV a1,#1
- LDR a2,[pc,#|__base_|-.-8]
- LDR a3,[pc,#|__rwlimit_|-.-8]
- SWI XOS_SynchroniseCodeAreas
-
- MOV a1,#11
- LDR a2,[pc,#|__o_exit|-.-8]
- MOV a3,#0
- MOV a4,#0
- SWI XOS_ChangeEnvironment
-
- LDR a1,[pc,#|__exerr_ptr|-.-8]
- LDR a2,[pc,#|__exerr_|-.-8]
- STR a2,[a1,#0]
-
- ADR a1,|__exreg|
- LDMIA a1,{sl,fp,sp}
-
- LDR a1,[pc,#|__exret_ptr|-.-8]
- LDR a2,[pc,#|__base_|-.-8]
- CMP a1,a2
- BCC |__exec_rtn_corrupt|
- BIC a2,a1,#3
- CMP a1,a2
- BNE |__exec_rtn_corrupt|
- MOV pc,a1
- |__exec_rtn_corrupt|
- ADR a1,|__exec_rtn_msg|
- SWI XOS_Write0
- SWI XOS_NewLine
- MOV a1,#SIGABRT
- BL raise ; should never return
- MOV a1, #1
- B |_exit| ; but just in case
- |__exec_rtn_msg|
- DCB "return from exec() not possible, return point corrupted", 0
- ALIGN
-
- |__o_exit|
- DCD 0 ; old Exit Handler
- |__o_himem|
- DCD 0 ; old HIMEM
- |__exret_ptr|
- DCD |__exret|
- |__base_ptr|
- DCD |__base|
- |__base_|
- DCD 0 ; __base value
- |__rwlimit_ptr|
- DCD |__rwlimit|
- |__rwlimit_|
- DCD 0 ; __rwlimit value
- |__exreg|
- % 12 ; sl,fp,sp
- |__exerr_ptr|
- DCD |__exerr|
- |__exerr_|
- DCD 0
- |__dynamic_num_ptr|
- DCD |__dynamic_num|
- |__dynamic_num_|
- DCD 0 ; __dynamic_num value
- |__break_ptr|
- DCD |__break|
- |__break_|
- DCD 0 ; __break value
-
- EXPORT |__exshift|
- |__exshift|
- DCD 0
- EXPORT |__codeshift|
- |__codeshift|
- DCD 0
-
- |__exec_s7|
-
- EXPORT |__exptr|
- |__exptr|
- DCD |__exec_s0|
- EXPORT |__exlen|
- |__exlen|
- [ |__4K_BOUNDARY| = 1
- DCD (|__exec_s7|-|__exec_s0| + 4095) :AND: -4096
- |
- DCD |__exec_s7|-|__exec_s0|
- ]
-
- END
-